条件評価のための"△[△condition△]△"
終了ステータスは、制御構造が評価する唯一の対象であるが、コマンドが正しく実行されたかどうかのみを評価しているわけでは有りません。シェルには、さまざまな評価ができるように、ブラケット"[△condition△]"で囲む制御構造が用意されているのです。
"[△condition△]"を使用することで、単純な比較でなく、ファイルのさまざまな属性(ファイルタイプ、パーミション、所有者、存在etc.)を確認したり、当然文字列を比較したり、ファイルの新旧なども比較できるのです。この"[△condition△]"は、ステートメントですが、中に書かれているconditionの終了ステータスが真(true)0か偽(false)1かただそれだけを返すというものであるため、このブラケットは、制御構造文に適したものである。
処理が成功した場合、真(true)で0を返します。
注)このconditionの前後のブラケットは、conditonをはさむ側に必ずSPACEが必要になりますので注意してください。
例) ["$a" = "$b"] 間違い -> [△"$a" = "$b"△] 修正後 SPACEの表現がしずらいので、三角で書いてます。このスペースは、タブ、ハード改行、;でokです。
test
二つの値を比較するテストを行いたいことが良くありますが、このようなことをする場合、testを使います。このtestは、比較が終わり成功すると真(true)0が帰ります。 このコマンドは、整数も扱うことができます。
書き方
test str1 -option str2
test fileA -option strB
test -option str1
test -option fileA括弧でグループ化ができる。
書き方
[ \( "2" > "1" \) -o \( "1"= "3" \) ]
ここから本番
文字列の比較、fileステータス、file存在、file新旧比較などあくまでも文字比較で書きます。数値では有りません。
理論演算子 真(true)0の条件 1 -a test1 と test2 真偽の論理積
真(true)0 and 真(true)0 偽(false)1 and 偽(false)12 -o test1 と test2の真偽の論理和
真(true)0 or 真(true)0 偽(false)1 or 偽(false)1 真(true)0 or 偽(false)1比較演算後の真(true)0偽(false)1に付いて論理演算をします。 []条件式の中で使用します。
| 演算子 |
真(true)0の場合の条件 | |
| 1 | -b file |
fileが存在し、かつブロックデバイスファイルである |
| 2 | -c file | fileが存在し、かつキャラクタブロックデバイスである |
| 3 | -d file | fileが存在し、かつデレクトリである |
| 4 | -e file | fileが存在する |
| 5 | -f file | fileが存在し、かつ通常のファイルである |
| 6 | -g file | fileが存在し、かつgetgidビットが設定されている |
| 7 | -G file | fileが存在し、かつ有効なグループIDで所有されている |
| 8 | -k file | fileが存在し、かつstickyビットが設定されている |
| 9 | -L file | fileが存在し、かつシンボリックが張られている |
| 10 | -n str1 | str1がNULLでない。(文字の長さが0より大きい。) |
| 11 | -O file | fileが存在し、かつ有効なIDが所有されている |
| 12 | -p file | fileが存在し、かつパイプまたは名前付きパイプFIFOである |
| 13 | -r file | fileが存在し、かつreadパーミションが与えられている |
| 14 | -s file | fileが存在し、かつ空でない |
| 15 | -S file | fileが存在し、かつソケットである |
| 16 | -t N | ファイルディスクリプタが端末を示している。 |
| 17 | -u file | fileが存在し、かつsetuidビットが設定されている。 |
| 18 | -w file | fileが存在し、かつwriteパーミションが与えられている |
| 19 | -x file | fileが存在し、かつfileがファイルの場合は、executeパーミションが、ディレクトリの場合は、searchパーミションが与えられる |
| 20 | -z str1 | str1がNULLである。(文字の長さが0) |
| 21 | fileA -nt fileB | fileAがfileBよりも新しい(修正日付を基準とする) |
| 22 | fileA -ot fileB | fileAがfileBよりも古い(修正日付を基準とする) |
| 23 | fileA -ef fileB |
fileAとfileBが同じファイルを指している(デバイスとinode番号が同じ) |
| 24 | ||
| 25 | str1 = str2 | str1がstr2と一致する。 |
| 26 | str1 != str2 | str1がstr2と一致しない。 |
| 27 | str1 < str2 | str1がstr2より小さい。 辞書の順番で |
| 28 | str1 > str2 | str1がstr2より大きい。 辞書の順番で |
理解するには->皆さんが苦労された英語の辞書の順番は、この演算子に沿って並べられています。
文字列演算子を使った例
stra="a"
str2="a"
if [ $str1 = $str2 ]; then # (25)=
echo " str1: $str1 str2: $str2 ストリングスは、同じものです。"
fi
str1="a"
str2="b"
if [ $str1 != $str2 ]; then # (26)!=
echo " str1: $str1 str2: $str2 ストリングスは、別のです。"
fi
str1="a"
str2="ab"
if [ $str1 < $str2 ]; then # (27)<
echo " str1: $str1 str2: $str2 ストリングスは、str1が小さいです。"
str1="ab"
str2="b"
if [ $str1 < $str2 ]; then #(27)<
echo " str1: $str1 str2: $str2 ストリングスは、str1が小さいです。"
fi
fi
str1="ab"
str2="a"
if [ $str1 > $str2 ]; then # (28)>
echo " str1: $str1 str2: $str2 ストリングスは、str1が大きいです。"
fi
str1="a"
if [ -n $str1 ]; then # (10)-n
echo " str1: $str1 ストリングスは、文字があります。"
fi
str1=""
if [ -z $str1 ]; then # (20)-z
echo " str1: $str1 ストリングスは、文字がありません。"
fi
色々な画像ファイル名から画像を判断しgif-fileへ変換し、filen-nameもgifへ変えるプログラムを使って文字列比較演算子の使い方を理解しよう。
filename=$1
extention=${filename##*. } # サフィクス以外を取り除く。
ppmfile=${filename%.*}.ppm # サフィクスを取り除き.ppmを加える。
outfile=${filename%.*}.gif # サフィクスを取り除き.gifを加える。
if [ -z $filename ]; then # (20)-zでfilenameがNULLであるか判断している。
echo "profile: ファイルがありません."
exit # 判定終了
fi
if [ $extention = gif ]; then # (25)=サフィクスがgifの場合そのまま終了。
exit # 判定終了
elif [ $extention = tga ]; then # (25)=サフィックスがtgaの場合
tgatoppm $filename > $ppmfile # tagtoをfilename(tga)で実行し $ppmfile(ppm)に書き込む。
elif [ $extention = xpm ]; then # (25)=
xpmtoppm $filename > $ppmfile
elif [ $extention = pcx ]: then # (25)=
pcxtoppm $filename > $ppmfile
elif [ $extention = tif ]; then # (25)=
tifftoppm $filename > $ppmfile
elif [ $extention =jpg ]; then # (25)=
djpeg $filename > $ppmfile
else # サフィクスが該当しない場合の処理を行う。
echoo "profile: $filename 処理対象にない画像ファイルです。"
exit # 判定終了
fi
ppmquant -quiet 256 $ppmfile | ppmogif -quiet > $outfile # ppmに加工されたfileを変換あわせて、サフィクスgifへ変えた名前で書き出す。
rm $ppnfile # tmpとして作成された.ppmを消す。
## stop run ##